/*
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package javax.xml.ws;

import java.util.concurrent.Future;

/**
 * The <code>Dispatch</code> interface provides support
 * for the dynamic invocation of a service endpoint operations. The
 * <code>javax.xml.ws.Service</code>
 * class acts as a factory for the creation of <code>Dispatch</code>
 * instances.
 *
 * @since JAX-WS 2.0
 **/
public interface Dispatch<T> extends BindingProvider {

    /**
     * Invoke a service operation synchronously.
     * <p>
     * The client is responsible for ensuring that the <code>msg</code> object
     * when marshalled is formed according to the requirements of the protocol
     * binding in use.
     *
     * @param msg An object that will form the message or payload of
     *            the message used to invoke the operation.
     * @return The response message or message payload to the
     * operation invocation.
     * @throws WebServiceException If a fault occurs during communication with
     *                             the service
     * @throws WebServiceException If there is any error in the configuration of
     *                             the <code>Dispatch</code> instance
     **/
    public T invoke(T msg);

    /**
     * Invoke a service operation asynchronously.  The
     * method returns without waiting for the response to the operation
     * invocation, the results of the operation are obtained by polling the
     * returned <code>Response</code>.
     * <p>
     * The client is responsible for ensuring that the <code>msg</code> object
     * when marshalled is formed according to the requirements of the protocol
     * binding in use.
     *
     * @param msg An object that will form the message or payload of
     *            the message used to invoke the operation.
     * @return The response message or message payload to the
     * operation invocation.
     * @throws WebServiceException If there is any error in the configuration of
     *                             the <code>Dispatch</code> instance
     **/
    public Response<T> invokeAsync(T msg);

    /**
     * Invoke a service operation asynchronously. The
     * method returns without waiting for the response to the operation
     * invocation, the results of the operation are communicated to the client
     * via the passed in <code>handler</code>.
     * <p>
     * The client is responsible for ensuring that the <code>msg</code> object
     * when marshalled is formed according to the requirements of the protocol
     * binding in use.
     *
     * @param msg     An object that will form the message or payload of
     *                the message used to invoke the operation.
     * @param handler The handler object that will receive the
     *                response to the operation invocation.
     * @return A <code>Future</code> object that may be used to check the status
     * of the operation invocation. This object MUST NOT be used to try to
     * obtain the results of the operation - the object returned from
     * <code>Future&lt;?>.get()</code> is implementation dependent
     * and any use of it will result in non-portable behaviour.
     * @throws WebServiceException If there is any error in the configuration of
     *                             the <code>Dispatch</code> instance
     **/
    public Future<?> invokeAsync(T msg, AsyncHandler<T> handler);

    /**
     * Invokes a service operation using the one-way
     * interaction mode. The operation invocation is logically non-blocking,
     * subject to the capabilities of the underlying protocol, no results
     * are returned. When
     * the protocol in use is SOAP/HTTP, this method MUST block until
     * an HTTP response code has been received or an error occurs.
     * <p>
     * The client is responsible for ensuring that the <code>msg</code> object
     * when marshalled is formed according to the requirements of the protocol
     * binding in use.
     *
     * @param msg An object that will form the message or payload of
     *            the message used to invoke the operation.
     * @throws WebServiceException If there is any error in the configuration of
     *                             the <code>Dispatch</code> instance or if an error occurs during the
     *                             invocation.
     **/
    public void invokeOneWay(T msg);
}
